home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 101-125 / scopedisk102 / dsart / myblank.c < prev   
C/C++ Source or Header  |  1995-03-19  |  7KB  |  357 lines

  1.  
  2. /*
  3.  *  MyBlank.c
  4.  *
  5.  *  DMouse screen blanker for use with DMouse V1.20
  6.  *
  7.  *  Is your computer BORED? If so, then you need...
  8.  *
  9.  *        DStringArt by Larry Phillips
  10.  *         with all the code for interfacing with DMouse
  11.  *          flagrantly ripped off from DLineArt
  12.  *           by Steve 'Raz' Berry
  13.  *            helped in turn by
  14.  *             Matt Dillon.
  15.  *
  16.  *  Compile +L w/ sup32.lib.  libs:dres.library no longer required
  17.  */
  18.  
  19. #include <local/typedefs.h>
  20. #include <local/ipc.h>
  21. #include <local/xmisc.h>
  22.  
  23. typedef struct IORequest IORequest;
  24.  
  25. int MAXX, MAXY;
  26.  
  27. #define DELAY 100
  28. #define BOUNDX MAXX-MINBOUND
  29. #define BOUNDY MAXY-MINBOUND
  30.  
  31. extern int Enable_Abort;
  32.  
  33. RP *rp;
  34. VP *vp;
  35. static SCR *Scr;
  36. static WIN *Win;
  37. static TA   Ta = {  (ubyte *)"topaz.font", 11 };
  38. static NS   Ns = {  0, 0, 0, 0, 1, -1, -1, HIRES|LACE, CUSTOMSCREEN|SCREENQUIET, &Ta };
  39. static NW   Nw = { 0, 0, 0, 0, 2, 1, NULL, BORDERLESS|NOCAREREFRESH|BACKDROP,
  40. NULL, NULL,NULL,NULL,NULL,0,0,8000,8000,CUSTOMSCREEN};
  41.  
  42. char *buf[20] = '\0';
  43.  
  44. float radians = 180/PI;
  45.  
  46. double sin(), cos();
  47.  
  48. #define MAXOBJ 10
  49.  
  50. struct Object
  51.     {
  52.     LONG    colour;
  53.     int    iter;
  54.     int    x1;
  55.     int    y1;
  56.     int    x2;
  57.     int    y2;
  58.     }    parms[MAXOBJ] = {
  59.  
  60.         /*    color  iter x1  y1  x2 y2  */
  61.  
  62.             0xa63, 360, 0, 0,   0, 0,
  63.             0xff0, 213, 0, 200, 0, 300,
  64.             0x00f, 320, 0, 0,   0, 0,
  65.             0x0f0, 360, 0, 0,   0, 0,
  66.             0xf0f, 360, 0, 0,   0, 0,
  67.             0xf00, 300, 0, 0,   0, 0,
  68.             0xfa0, 400, 0, 0,   0, 0,
  69.             0x0ff, 270, 0, 0,   0, 0,
  70.             0xf0f, 360, 0, 0,   0, 0,
  71.             0x0f4, 360, 0, 0,   0, 0
  72.     };
  73.  
  74. int
  75.     x1 = 0,
  76.     x2 = 0,
  77.     y1 = 0,
  78.     y2 = 0,
  79.     theta = 0,
  80.     count = 0,
  81.     object = 0,
  82.     objcount = 0,
  83.     delaycount = 0;
  84.  
  85. void
  86. InitScrStructures()
  87. {
  88.     SCR scr;
  89.     if (GetScreenData(&scr, sizeof(scr), WBENCHSCREEN, NULL)) {
  90.         if (scr.ViewPort.Modes & HIRES)
  91.             MAXX = scr.Width;
  92.         else
  93.             MAXX = scr.Width * 2;
  94.         if (scr.ViewPort.Modes & LACE)
  95.             MAXY = scr.Height;
  96.     else
  97.         MAXY = scr.Height * 2;
  98.     }
  99.     else {
  100.         MAXX = 640;
  101.         MAXY = 200;
  102.     }
  103.     Ns.Width  = MAXX;
  104.     Nw.Width  = MAXX;
  105.     Ns.Height = MAXY;
  106.     Nw.Height = MAXY;
  107. }
  108.  
  109. main()
  110. {
  111. int var;
  112. IORequest AddReq;    /* for dmouse ipc    */
  113. IORequest RemReq;
  114. PORT    *dmport;
  115. PORT    *ipport;
  116. char    foo;    /*  dummy variable, address used as id    */
  117. short   notdone = 1;
  118. radians = 3.14159/180;
  119.  
  120.     Enable_Abort = 0;
  121.  
  122.  
  123.     ipport = CreatePort(NULL, 0);   /*  ipc port    */
  124.  
  125.     if (openlibs(INTUITION_LIB|GRAPHICS_LIB) == 0)
  126.         goto fail;
  127.  
  128.     InitScrStructures();
  129.  
  130.     AddReq.io_Message.mn_ReplyPort = ipport;
  131.     AddReq.io_Command = 0x84;
  132.     AddReq.io_Unit = (struct Unit *)&foo;
  133.     AddReq.io_Flags = 0x0C;    /* %1100 (screen blanker, no mouse blanker) */
  134.  
  135.     RemReq.io_Message.mn_ReplyPort = ipport;
  136.     RemReq.io_Command = 0x85;
  137.     RemReq.io_Unit = (struct Unit *)&foo;
  138.  
  139.     Forbid();
  140.     if (dmport = FindPort("DMouse.ipc"))
  141.         PutMsg(dmport, &AddReq.io_Message);
  142.     Permit();
  143.     if (dmport == NULL) {
  144.         puts("DMouse not running or <V1.20");
  145.         goto fail;
  146.     }
  147.  
  148.     while (notdone) {
  149.         long mask = SIGBREAKF_CTRL_C | (1 << ipport->mp_SigBit);
  150.         if (Scr)
  151.             mask = SetSignal(0L, mask);
  152.         else
  153.             mask = Wait(mask);
  154.  
  155.         if (mask & SIGBREAKF_CTRL_C)
  156.             notdone = 0;
  157.         if (mask & (1 << ipport->mp_SigBit)) {
  158.             IORequest *ior;
  159.             while (ior = (IORequest *)GetMsg(ipport)) {
  160.                 if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
  161.                     notdone = 0;
  162.                     continue;
  163.                 }
  164.             switch(ior->io_Command) {
  165.                 case 0x82:
  166.                     screenon();
  167.                     break;
  168.                 case 0x83:
  169.                     screenoff();
  170.                     break;
  171.                 case 0x86:
  172.                     notdone = 0;
  173.                     break;
  174.             }
  175.             ReplyMsg(&ior->io_Message);
  176.             }
  177.         }
  178.         if (Win) {
  179.             LineArt();
  180.             }
  181.     }
  182.     screenon();
  183.  
  184.     PutMsg(dmport, &RemReq.io_Message);
  185.         {
  186.         register IORequest *ior = NULL;
  187.         while (ior != &AddReq) {
  188.             WaitPort(ipport);
  189.             ior = (IORequest *)GetMsg(ipport);
  190.             if (ior->io_Message.mn_Node.ln_Type == NT_MESSAGE)
  191.             ReplyMsg(&ior->io_Message);
  192.         }
  193.     }
  194.  
  195. fail:
  196.         DeletePort(ipport);
  197.         closelibs(-1);
  198. }
  199.  
  200. screenoff()
  201. {
  202.     if (Scr)
  203.         ScreenToFront(Scr);
  204.     else
  205.     if (Scr = OpenScreen(&Ns)) {
  206.         Nw.Screen = Scr;
  207.         if (Win = OpenWindow(&Nw)){
  208.             vp = &Scr->ViewPort;
  209.             rp = Win->RPort;
  210.             LoadRGB4(vp,&parms[0].colour,2L);
  211.             count = 0;
  212.         }
  213.     ShowTitle(Scr, FALSE);
  214.     }
  215. }
  216.  
  217. screenon()
  218. {
  219.     if (Win)
  220.         CloseWindow(Win);
  221.     if (Scr)
  222.         CloseScreen(Scr);
  223.     Win = NULL;
  224.     Scr = NULL;
  225.     vp = NULL;
  226.     rp = NULL;
  227. }
  228.  
  229. LineArt()
  230. {
  231. int i;
  232.  
  233.     WaitTOF();
  234.  
  235.     SetAPen(rp, 1L);
  236.  
  237.     if (count == 0) {
  238.         objcount = parms[object].iter;
  239.         LoadRGB4(vp,&parms[object].colour,2L);
  240.         x1 = parms[object].x1;
  241.         y1 = parms[object].y1;
  242.         x2 = parms[object].x2;
  243.         y2 = parms[object].y2;
  244.         calcobj(object);
  245.         count++;
  246.         }
  247.  
  248.     if (count == objcount) {
  249.         WaitTOF();
  250.         if (++delaycount == DELAY) {
  251.             count++;
  252.             delaycount = 0;
  253.             return(0);
  254.             }
  255.         else
  256.             return(0);
  257.         }
  258.  
  259.     if (count > objcount)  {
  260.         count = 0;
  261.         object++;
  262.         if (object == MAXOBJ) object = 0;
  263.         Move(rp, 0, 0);
  264.         ClearScreen(rp);
  265.         delaycount = 0; 
  266.         return(0);
  267.         }
  268.  
  269.  
  270.     Move(rp, x1, y1);
  271.     Draw(rp, x2, y2);
  272.  
  273.     count++;
  274.  
  275.     calcobj(object);
  276.     return(0);
  277. }
  278.  
  279. calcobj(object)
  280.  
  281. int object;
  282. {
  283.  
  284.     switch (object) {
  285.         case 0:
  286.             x1 = (int)( 320 + (100 * cos( (float)count*radians)) );
  287.             y1 = (int)( 250 + (100 * sin( (float)count*radians)) );
  288.             x2 = (int)( x1 + (100 * cos( (float)x1*radians)) );
  289.             y2 = (int)( y1 + (100 * sin( (float)x1*radians)) );
  290.             break;
  291.         case 1:
  292.             x1 += 3;
  293.             x2 = (int)( 320 + (100 * cos( (float)x1*radians)) );
  294.             y2 = (int)( 200 + (100 * sin( (float)x1*radians)) );
  295.             break;
  296.         case 2:
  297.             if ( y1 != 398 ) {
  298.                 x1 += 3;
  299.                 y1 += 2;
  300.                 }
  301.             x2 = (int)( 200 + (100 * cos( (float)count*radians)) );
  302.             y2 = (int)( 200 + (100 * sin( (float)count*radians)) );
  303.             break;
  304.         case 3:
  305.             x1 = (int)( 201 + (200 * cos( (float)count*radians)) );
  306.             y1 = (int)( 200 + (199 * sin( (float)count*radians)) );
  307.             x2 = (int)( 439 + (200 * sin( (float)count*radians)) );
  308.             y2 = (int)( 200 + (199 * cos( (float)count*radians)) );
  309.             break;
  310.         case 4:
  311.             x1 = (int)( 101 + (100 * cos( (float)(count*2)*radians)) );
  312.             y1 = (int)( 200 + (100 * sin( (float)(count*2)*radians)) );
  313.             x2 = (int)( 439 + (200 * sin( (float)count*radians)) );
  314.             y2 = (int)( 200 + (199 * cos( (float)count*radians)) );
  315.             break;
  316.         case 5:
  317.             x1 = (int)( 201 + (count * cos( (float)count*radians))/2 );
  318.             y1 = (int)( 200 + (count * sin( (float)count*radians))/2 );
  319.             x2 = (int)( 439 + (count * sin( (float)count*radians)) );
  320.             y2 = (int)( 200 + (count * cos( (float)count*radians)) );
  321.             break;
  322.         case 6:
  323.             x1 = (int)( 320 + (300 * cos( (float)(count*3)*radians)) );
  324.             y1 = (int)( 200 + (100 * sin( (float)(count*3)*radians)) );
  325.             x2 = (int)( 320 + (100 * cos( (float)(count*5)*radians)) );
  326.             y2 = (int)( 200 + ( 50 * sin( (float)(count*5)*radians)) );
  327.             break;
  328.         case 7:
  329.             x1 += 2;
  330.             y1 = 200;
  331.             x2 = (int)( x1 + (int)( 100 * cos( (float)x1 * radians)));
  332.             y2 = (int)( 200 + (int)( 50 * sin( (float)x1 * radians)));
  333.             break;
  334.         case 8:
  335.             x1 = (int)( 201 + (200 * cos( (float)count*radians))/3 );
  336.             y1 = (int)( 200 + (199 * sin( (float)count*radians))/3 );
  337.             x2 = (int)( 439 + (200 * cos( (float)count*radians)) );
  338.             y2 = (int)( 200 + (199 * sin( (float)count*radians)) );
  339.             break;
  340.         case 9:
  341.             x1 = (int)( 320 + abs((200 * cos( (float)count*radians))/2) );
  342.             y1 = (int)( 300 + (199 * sin( (float)count*radians))/2 );
  343.             x2 = (int)( 320 + (150 * sin( (float)count*radians)) );
  344.             y2 = (int)( 200 + (150 * cos( (float)count*radians)) );
  345.             break;
  346.         }
  347.  
  348. /*  Debug stuff here, for checking iterations or whatever. */
  349.  
  350. /*    sprintf(buf, "%d", count);
  351.  *    Move(rp, 400, 20);
  352.  *    Text(rp, buf, 4);
  353.  */
  354.  
  355.     return(0);
  356. }
  357.